﻿#define _CRT_SECURE_NO_WARNINGS 1
#define _CRT_SECURE_NO_WARNINGS 1
//操作符
//作业标题(704)
//交换两个变量（不创建临时变量）
//
//作业内容
//不允许创建临时变量，交换两个整数的内容
//#include<stdio.h>
//int main()
//{
//	int a = 0;
//	int b = 0;
//	scanf("%d %d", &a, &b);
//	a = a + b;
//	b = a - b;
//	a = a - b;
//	printf("a=%d,b=%d\n", a, b);
//	return 0;
//}



//作业标题(705)
//统计二进制中1的个数
//
//作业内容
//写一个函数返回参数二进制中 1 的个数。
//
//比如： 15    0000 1111    4 个 1
////
//#include<stdio.h>
//int count_one(int n)
//{
//	int i = n & 1;
//	int count = 0;
//	while (n)
//		{
//			i << 1;
//			if (i == 1)
//			count++;
//		}
//	return count;
//}
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	int ret = count_one(n);
//	printf("%d", ret);
//	return 0;
//}



//作业标题(706)
//打印整数二进制的奇数位和偶数位
//
//作业内容
//获取一个整数二进制序列中所有的偶数位和奇数位，分别打印出二进制序列
//#include<stdio.h>
//int main()
//{
//	int n = 0;
//	int i = n & 1;
//	int j = j & 1;
//	scanf("%d", &n);
//	while (i)
//	{
//		int i = n & 1;//偶数位
//		printf("%d ", i);
//		i=i<< 1;//奇数位
//	}
//	printf("\n");
//	while (j)
//	{
//		int j = n & 1;
//		j=j<< 1;//奇数
//		printf("%d ", j);
//	}
//	return 0;
//}


//作业标题(707）❌
//求两个数二进制中不同位的个数
//
//作业内容
//编程实现：两个int（32位）整数m和n的二进制表达中，有多少个位(bit)不同？
//
//输入例子 :
//
//1999 2299
//
//输出例子 : 7


//#include<stdio.h>
//int main()
//{
//	int n = 0;
//	int m = 0;
//	int count = 0;
//	scanf("%d %d", &n, &m);
//	while (n)
//	{
//		if (n & 1 != m & 1)
//		{
//			count++;
//		}
//			(n&1) << 1;
//			(m&1) << 1;
//	}
//	printf("%d", count);
//	return 0;
//}

//#include<stdio.h>
//int main()
//{
//    int a = 0;
//    int b = 0;
//    int count = 0;
//    scanf("%d %d", &a, &b);
//    for (int i = 0; i < 32; i++)
//    {
//        if (((a >> i) & 1) != ((b >> i) & 1))
//            count++;
//    }
//
//    printf("%d", count+1);
//
//    return 0;
//}

//#include<stdio.h>
//int main()
//{
//    int a = 0;
//    int b = 0;
//    int count = 0;
//    scanf("%d %d", &a, &b);
//    /*int n = a^b;
//    while(n)
//    {
//        n = n&(n-1);
//        count++;
//    }
//    printf("%d",count);
//    */
//    for (int i = 0; i < 32; i++)
//    {
//        if (((a >> i) & 1) != ((b >> i) & 1))
//            count++;
//    }
//
//    printf("%d", count);
//
//    return 0;
//}


//修改订正过
////题目1
////交换两个变量（不创建临时变量）
////不允许创建临时变量，交换两个整数的内容
////方法1
//#include<stdio.h>
//int main()
//{
//	int a = 0;
//	int b = 0;
//	scanf("%d %d", &a, &b);
//	a = a + b;//a=a+b
//	b = a - b;//a+b-b=a把a的值赋给了b
//	a = a - b;//a+b-a=b把b的值赋给a
//	printf("a=%d b=%d", a, b);
//	return 0;
//}

////方法2
//#include<stdio.h>
//int main()
//{
//	int a = 0;
//	int b = 0;
//	scanf("%d %d", &a, &b);
//	a = a ^ b;
//	b = a ^ b;//a^b^b=a
//	a = a ^ b;//a^b^a=b
//	printf("a=%d b=%d", a, b);
//	return 0;
//}



//题目2
//统计二进制中1的个数
//写一个函数返回参数二进制中 1 的个数。
//比如： 15    0000 1111    4 个 1
// 1234%10=4
// 1234/10=123
// 123%10=3
// 123/10=12
// 
// 15%2=1 00000000 00000000 00000000 00001111 1√
// 15/2=7 00000000 00000000 00000000 00000110 7
// 7%2=1  00000000 00000000 00000000 00000110 1√
// 7/2=3  00000000 00000000 00000000 00000011 3
// 3%2=1  00000000 00000000 00000000 00000011 1√
// 3/2=1  00000000 00000000 00000000 00000001 1
// 1%2=1  00000000 00000000 00000000 00000001 1√
// 1/2=0结束循环
// 
//方法1
//#include<stdio.h>
////int is_count_1(int n)//但是如果是负数就是错误的❌
//int is_count_1(unsigned int n)//搞成无符号的整数就可以输入负数
//
//{
//	int count = 0;
//	while (n)//0
//	{
//		if (n % 2 == 1)
//			count++;
//		n = n / 2;
//	}
//	return count;
//}
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	int ret=is_count_1(n);
//	printf("%d", ret);
//	return 0;
//}
////-1
////10000000 00000000 00000000 00000001_原码
////11111111 11111111 11111111 11111110_反码
////11111111 11111111 11111111 11111111_补码
////无符号
////11111111 11111111 11111111 11111111_原码反码补码均是这个


//方法2
// &有0则为0.同时为1才为1
//((n>>1)&1)得到的是最小位==1则有 ==0则为0
//#include<stdio.h>
//int is_count_1(int n)
//{
//	int count = 0;
//	while(n)
//	{
//		if (((n >> 1) & 1) == 1)//死循环
//			count++;
//	}
//	return count;
//}
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	int ret = is_count_1(n);
//	printf("%d", ret);
//	return 0;
//}




//#include<stdio.h>
//int is_count_1(int n)
//{
//	int count = 0;
//	int i = 0;
//	for(i=0;i<32;i++)
//	{
//		if (((n >> i) & 1) == 1)//死循环
//			count++;
//	}
//	return count;
//}
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	int ret = is_count_1(n);
//	printf("%d", ret);
//	return 0;
//}
//
////方法3
////n=n&(n-1)
////15        00000000 00000000 00000000 00001111
////15-1=14   00000000 00000000 00000000 00001110
////15&14     00000000 00000000 00000000 00001110 消除1
//// 
////15&14     00000000 00000000 00000000 00001110
////15&14-1   00000000 00000000 00000000 00001101
////&         00000000 00000000 00000000 00001100 消除1
//
////          00000000 00000000 00000000 00001100
////-1        00000000 00000000 00000000 00001011
////&         00000000 00000000 00000000 00001000  消除1
//
////          00000000 00000000 00000000 00001000
////-1        00000000 00000000 00000000 00001011
////&         00000000 00000000 00000000 00001000 消除1
////计算1的个数等于消除了几个1的个数
////18        00000000 00000000 00000000 00010010
////18-1      00000000 00000000 00000000 00010001
////&         00000000 00000000 00000000 00010000
//
////          00000000 00000000 00000000 00010000
////-1        00000000 00000000 00000000 00001111
//
//
//
//#include<stdio.h>
//int is_count_1(int n)
//{
//	int count = 0;
//	while (n)//n!=0的时候进入
//	{
//		n = n & (n - 1);//每消除一次1计算一次 /会进位就一定会消除1
//		count++;
//	}
//	return count++;
//}
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	int ret=is_count_1(n);
//	printf("%d", ret);
//	return 0;
//}



////题目3
////打印二进制序列的奇数位和偶数位
////拿到二进制所有位
////00000000 00000000 00000000 0000000 0
////                                 偶奇
////32是符号位
//#include<stdio.h>
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	int i = 0;
//	printf("偶数位：");
//	for (i= 1; i < 32; i+=2)//偶数位
//	//for(i=31;i>=1;i-=2)//偶数位
//	{
//		int t = ((n >> i) & 1);
//		printf("%d ", t);
//	}
//	printf("\n");
//	printf("奇数位：");
//	for (i = 0; i < 31; i += 2)//奇数位
//	//for(i=30;i>=0;i-=2)//奇数位
//	{
//		int r = ((n >> i) & 1);
//		printf("%d ", r);
//	}
//	return 0;
//}

//#include<stdio.h>
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	int i = 0;
//	for (i = 0; i < 32; i++)
//	{
//		if ((n >> i) & 1 == 1)
//			printf("移动i为时此位的数字：1\n");
//		if ((n >> i) & 1 == 0)
//			printf("移动i为时此位的数字：0\n");
//	}
//	return 0;
//}



//题目4
//作业标题(707)
//求两个数 二进制中不同位的个数
//作业内容
//编程实现：两个int（32位）整数m和n的二进制表达中，有多少个位(bit)不同？
//输入例子 :
//1999 2299
//输出例子 : 7

////方法1
//#include<stdio.h>
//int main()
//{
//	int m = 0;
//	int n = 0;
//	scanf("%d %d", &m, &n);
//	//输入两个数
//	int i = 0;
//	int count = 0;
//	for (i = 0; i < 32; i++)
//	{
//		if (((m >> i) & 1) != ((n >> i) & 1))
//			count++;
//	}
//	printf("%d", count);
//	return 0;
//}

////方法2
//#include<stdio.h>
//int main()
//{
//	int m = 0;
//	int n = 0;
//	scanf("%d %d", &m, &n);
//	int r = m ^ n;
//	//因为异或操作符，对应的二进制位相同为0，相异为1
//	//m和n的不同的二进制位异或后一定是1
//	//那我们数一下r的二进制1的个数，就是m和n中不同位的个数
//	int count = 0;
//	while (r)
//	{
//		//找到r中的1的个数
//		//这里就可以使用第二题中的三种方法中的任何一种
//		r = r & (r - 1);
//		count++;
//	}
//	printf("%d", count);
//	return 0;
//}